package com.v9.common.core.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.v9.common.core.domain.AbstractEntity;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @author lunshi
 */
public  interface IAbstractService< T extends AbstractEntity,ID extends Serializable>{
    /**
     * 查询单个*
     *
     * @param id
     * @return
     */
    T findById(ID id);

    List<T> findByIds(ID... ids);
    /**
     * 更新单个值*
     *
     * @param id
     * @param property
     * @param value
     */
    void save(ID id, String property, Object value);

    /**
     *
     * @param id
     * @param property
     * @param value
     */
    void inc(ID id,String property,Number value);

    /**
     *
     * @param id
     * @param incMap
     */
    void inc(ID id,Map<String,Number> incMap);

    /**
     * 软删除*
     *
     * @param id
     */
    void remove(ID... id);

    /**
     * 删除*
     *
     * @param soft 是否软删除*
     * @param id   标识
     */
    void remove(Boolean soft, ID... id);

    /**
     * 根据条件删除*
     * @param query
     */
    void remove(QueryWrapper<T> query);
    /**
     * * 查询条楼群
     *
     * @param queryWrapper
     * @return
     */
    Long selectCount(QueryWrapper<T> queryWrapper);

    /**
     * 查询*
     * @param t
     * @return
     */
    Long selectCount(T t);

    /**
     * * 插入
     *
     * @param t
     */
    void insert(T ...t);

    /**
     * 跟据id更新*
     *
     * @param t
     */
    void updateById(T ...t);

    /**
     * 更新
     * @param updateWrapper
     */
    void update(UpdateWrapper<T> updateWrapper);

    /**
     * 查询单个*
     *
     * @param entity
     * @return
     */
    T findByOne(T entity);

    /**
     * * 查询单个
     *
     * @param queryWrapper
     * @return
     */
    T findByOne(QueryWrapper<T> queryWrapper);

    /**
     * 添加或修改*
     * @param t
     * @return
     */
    T saveOrInsert(T t);
    /**
     * 查询所有*
     * @return
     */
    List<T> queryAll();

    public List<T> query(T entity);

    <ET> List<ET> query(String sql, Map<String, ?> paramMap, Class<ET> elementType);

    /**
     * 查询
     * 例 select * from user where id=:id*
     * @param sql
     * @param params
     * @return
     */
    List<Map<String, Object>> query(String sql, Map<String, Object> params);

    /**
     * 查询*
     *
     * @param queryWrapper
     * @return
     */
    List<T> query(QueryWrapper<T> queryWrapper);

    /**
     * 查询分类*
     *
     * @param entity
     * @param page 分页条件
     * @return
     */
    Page<T> queryByPage(T entity, Pageable page);

    /**
     * 查询分类*
     *
     * @param queryWrapper
     * @param request      分页条件
     * @return
     */
    Page<T> queryByPage(QueryWrapper<T> queryWrapper, Pageable request);

}
